#ifndef _OBJECT_HEADER_H
#define _OBJECT_HEADER_H

#include "utils.h"

//对象类型
typedef enum {
    OT_CLASS,       //此项是class类型,以下都是object类型
    OT_LIST,
    OT_MAP,
    OT_MODULE,
    OT_RANGE,
    OT_STRING,
    OT_UPVALUE,     // 自由变量，闭包中的一个概念
    OT_FUNCTION,
    OT_CLOSURE,     // 闭包
    OT_INSTANCE,    //对象实例
    OT_THREAD
} ObjType;

typedef struct objHeader {
    ObjType type;
    bool isDark;// 是否可达,用于垃圾回收
    Class *class;// 对象的类
    struct objHeader *next;// 下一个对象，这个就相当于一个链表
} ObjHeader;

typedef enum {
    VT_UNDEFINED,
    VT_NULL,
    VT_TRUE,
    VT_FALSE,
    VT_NUM,
    VT_OBJ // 值为对象，指向对象头
} ValueType;

typedef struct {
    ValueType type;
    union {
        double num;
        ObjHeader *objHeader;
    };

} Value;//通用的值结构

DECLARE_BUFFER_TYPE(Value)

void initObjHeader(VM *vm, ObjHeader *objHeader, ObjType objType, Class *class);

#endif
